package com.rustic.server.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.rustic.server.dto.FoodAddDTO;
import com.rustic.server.dto.FoodUpdateDTO;
import com.rustic.server.po.Food;
import com.rustic.server.query.FoodAdminListQuery;
import com.rustic.server.query.FoodUserListQuery;
import com.rustic.server.vo.FoodVO;
import com.rustic.server.vo.FoodWebVO;
import com.rustic.server.vo.list.FoodAdminListVO;
import com.rustic.server.vo.list.FoodWebListVO;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * 表[food]对应的服务类
 *
 * @author auto
 */

public interface FoodService extends IService<Food> {

    String FOOD_NOT_EXIST = "美食推荐不存在";

    /**
     * 查询（根据ID 批量查询）
     *
     * @param idList id列表
     * @return 美食推荐列表
     */
    List<Food> listByIdIn(List<Integer> idList);

    /**
     * 查询（根据ID 批量查询）并转换成Map
     *
     * @param idList id列表
     * @return 美食推荐列表
     */
    Map<Integer, Food> mapByIdIn(List<Integer> idList);

    /**
     * 管理列表查询条件
     *
     * @param query 查询参数
     * @return 查询条件
     */
    LambdaQueryWrapper<Food> toAdminListWrapper(FoodAdminListQuery query);

    /**
     * toAdminListVo
     *
     * @param foodList foodList
     * @return AdminListVO
     */
    List<FoodAdminListVO> toAdminListVo(List<Food> foodList);

    /**
     * toWebListVo
     *
     * @param foodList foodList
     * @param userId   用户id
     * @return WebListVo
     */
    List<FoodWebListVO> toWebListVo(List<Food> foodList, int userId);

    /**
     * 用户美食列表查询条件
     *
     * @param query 查询参数
     * @return 查询条件
     */
    LambdaQueryWrapper<Food> toUserListWrapper(FoodUserListQuery query);

    /**
     * 添加美食
     *
     * @param foodAddDTO foodAddDTO
     */
    @Transactional(rollbackFor = Exception.class)
    void add(FoodAddDTO foodAddDTO);

    /**
     * 更新美食
     *
     * @param foodUpdateDTO foodUpdateDTO
     */
    @Transactional(rollbackFor = Exception.class)
    void updateFood(FoodUpdateDTO foodUpdateDTO);

    /**
     * 删除美食
     *
     * @param id id
     */
    @Transactional(rollbackFor = Exception.class)
    void delete(int id);

    /**
     * 美食发布下架
     *
     * @param id id
     * @return 返回修改后的状态
     */
    int enabled(int id);

    /**
     * 根据id获取详情
     *
     * @param id id
     * @return FoodVO
     */
    FoodVO getDetailById(int id);

    /**
     * 前台展示详情
     *
     * @param id 美食推荐id
     * @return FoodWebVO
     */
    FoodWebVO getByIdToWeb(int id);
}
